import unittest
import sub_array
from unittest.mock import patch


class Testing(unittest.TestCase):
    def test_mul_max_int(self):
        self.assertEqual(sub_array.main([1, 2, 3], "*", "max"), 6)
        self.assertEqual(sub_array.main([1, 2, 3, 4, 5], "*", "max"), 120)
        self.assertEqual(sub_array.main([1, 2, 0, 4, 5], "*", "max"), 20)
        self.assertEqual(sub_array.main([-2, -3, -4, -5], "*", "max"), 120)
        self.assertEqual(sub_array.main([5], "*", "max"), 5)
        self.assertEqual(sub_array.main([2, -5, 4, 0, 1], "*", "max"), 4)
        self.assertEqual(sub_array.main([0, 0, 0, 0, 0], "*", "max"), 0)

    def test_mul_min_int(self):
        self.assertEqual(sub_array.main([1, 2, 3], "*", "min"), 1)
        self.assertEqual(sub_array.main([1, 2, 3, 4, 5], "*", "min"), 1)
        self.assertEqual(sub_array.main([1, 2, 0, 4, 5], "*", "min"), 0)
        self.assertEqual(sub_array.main([-2, -3, -4, -5], "*", "min"), -60)
        self.assertEqual(sub_array.main([5], "*", "min"), 5)
        self.assertEqual(sub_array.main([2, -5, 4, 0, 1], "*", "min"), -40)
        self.assertEqual(sub_array.main([0, 0, 0, 0, 0], "*", "min"), 0)

    def test_mul_max_float(self):
        self.assertEqual(sub_array.main([1.0, 2.0, 3.0], "*", "max"), 6.0)
        self.assertEqual(sub_array.main([1, 2.5, 3, 4, 5], "*", "max"), 150.0)
        self.assertEqual(sub_array.main([1.0, 2.0, 0.0, 4.0, 5.0], "*", "max"), 20.0)
        self.assertEqual(sub_array.main([-2.0, -3.0, -4.0, -5.0], "*", "max"), 120.0)
        self.assertEqual(sub_array.main([5.0], "*", "max"), 5.0)
        self.assertEqual(sub_array.main([2.0, -5.0, 4.0, 0.0, 1.0], "*", "max"), 4.0)
        self.assertEqual(sub_array.main([0.0, 0.0, 0.0, 0.0, 0.0], "*", "max"), 0.0)

    def test_mul_min_float(self):
        self.assertEqual(sub_array.main([1.0, 2.0, 3.0], "*", "min"), 1.0)
        self.assertEqual(sub_array.main([1, 2.5, 3, 4, 5], "*", "min"), 1.0)
        self.assertEqual(sub_array.main([1.0, 2.0, 0.0, 4.0, 5.0], "*", "min"), 0.0)
        self.assertEqual(sub_array.main([-2.0, -3.0, -4.0, -5.0], "*", "min"), -60.0)
        self.assertEqual(sub_array.main([5.0], "*", "min"), 5.0)
        self.assertEqual(sub_array.main([2.0, -5.0, 4.0, 0.0, 1.0], "*", "min"), -40.0)
        self.assertEqual(sub_array.main([0.0, 0.0, 0.0, 0.0, 0.0], "*", "min"), 0.0)

    @patch('builtins.input')
    def test_input(self, mock_input):
        test_array = sub_array.SubArray()

        mock_input.return_value = '[1, 2, 3]'
        self.assertEqual(sub_array.SubArray.set_array(test_array), [1, 2, 3])

        mock_input.return_value = '[1.0, 2.0, 3.0]'
        self.assertEqual(sub_array.SubArray.set_array(test_array), [1.0, 2.0, 3.0])

        mock_input.return_value = '[-1, -2, -3]'
        self.assertEqual(sub_array.SubArray.set_array(test_array), [-1, -2, -3])

        mock_input.return_value = '[]'
        self.assertEqual(sub_array.SubArray.set_array(test_array), [])

        mock_input.return_value = '1,2,3'
        self.assertEqual(sub_array.SubArray.set_array(test_array), None)

        mock_input.return_value = '[a,b,c]'
        self.assertEqual(sub_array.SubArray.set_array(test_array), None)

        mock_input.return_value = '["1",2,3]'
        self.assertEqual(sub_array.SubArray.set_array(test_array), None)

        mock_input.return_value = '(1,2,3)'
        self.assertEqual(sub_array.SubArray.set_array(test_array), None)


if __name__ == '__main__':
    unittest.main()
